for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log('origin', i);
    }, 1000);
}

console.log('origin', i);   // 5 5 5 5 5


/*
    因为 for 循环是很快的，当执行完 for 循环，变量 i 已经变成了 5，for 循环里面的 setTimeout 执行了 5 次，
    每次都会将这个函数的执行推迟 1000 ms，然后打印变量 i，打印的都是 5
*/


// 改造代码------------------------------------------------------------------------------------------------------------------------------------------
// 1. 期望结果1： 5 0 1 2 3 4
    /*
        (1)思路1：setTimeout第三个参数： 附加参数，一旦定时器到期，他们会作为参数传递给function
            看下面的代码，将每一轮循环的i值都存储到setTimeout的第三个参数，回调函数的形参j，会收到每一轮循环的i
    */ 

    for (var i = 0; i < 5; i++) {
        setTimeout(function(j) {
            console.log('(1)',j)
        }, 1000, i);
    };

    console.log('(1)', i);   // 5 0 1 2 3 4


    /*
        (2)思路2：外部函数入参
    */
    
    var output = function(i) {
        setTimeout(function() {
            console.log(i);
        }, 1000);
    };


    for (var i = 0; i < 5; i++) {
        output(i);
    };


    /*
        思路3：立即执行函数
    */

    for (var i = 0; i < 5; i++) {
        // 这里的 i 被赋值给了立即执行函数作用域内的变量 j
        (function(j) {
            setTimeout(() => {
                console.log(j)
            }, 1000)
        })(i);
    };
    

    /*
        思路4：改let为var
    */
   for (let i = 0; i < 5; i++) {
    setTimeout(()=>{
        console.log(i)
    }, 1000)
   }

//--------------------------------------------------------------------------------------------------------------------------
// 题1：
function test (){
    var num = []
    var i

    for (i = 0; i < 10; i++) {
        num[i] = function () {
            console.log(i)
        }
    };
    return num[9]
}

test()();   //10
